# -*- coding:utf-8 -*-
# @File       :   二分答案.py
# @Author     :   LINING
# @Time       :   2024/3/6 15:49
# @Description :  最大值最小化
"""
https://leetcode.cn/problems/split-array-largest-sum/
给定一个非负整数数组 nums 和一个整数 k ，你需要将这个数组分成 k 个非空的连续子数组。

设计一个算法使得这 k 个子数组各自和的最大值最小。



示例 1：

输入：nums = [7,2,5,10,8], k = 2
输出：18
解释：
7    2,5,10,8
7,2  5,10,8
7,2,5   10,8
7,2,5,10   8
一共有四种方法将 nums 分割为 2 个子数组。
其中最好的方式是将其分为 [7,2,5] 和 [10,8] 。
因为此时这两个子数组各自的和的最大值为18，在所有情况中最小。

二分，买min这个大的盒子买几个盒子
"""


def get_box(size, nums):
    """
    size：盒子大小
    nums:数组
    """
    # 盒子个数
    box = 1
    # 盒子里已经装下的数
    box_size = 0
    for i in nums:
        if box_size+i <= size:
            box_size = box_size+i
        else:
            box = box+1
            box_size = i
    return box


def get_min(nums, k):
    left = max(nums)
    right = sum(nums)
    while left < right:
        mid = int((left+right)/2)
        if get_box(mid, nums) <= k:
            right = mid
        else:
            left = mid+1
    return right


num = [7, 2, 5, 10, 8]
k = 2
print(get_min(num, k))


